//是一个模板类，是一个任务包，是对一个函数进行二次封装，封装成为一个可调用对象作为任务放到其他线程执行的
//任务包封装好了之后，可以在任意位置进行调用，通过管理的future来获取执行结果

#include <iostream>
#include <future>
#include <thread>

int Add(int n1, int n2)
{
    return n1 + n2;
}

int main()
{
    //1. 封装任务
    // std::packaged_task<int(int, int)> task(Add);
    //获取任务包关联的future对象
    // std::future<int> res = task.get_future();

    //2. 执行任务
    //task(11, 22); //这样的话是同步执行

    //3. 获取结果
    // std::cout << res.get() << std::endl;

    //异步执行策略：
    //用一个智能指针管理
    auto task = std::make_shared<std::packaged_task<int(int, int)>>(Add);
    std::future<int> res = task->get_future();
    std::thread thr([task](){
        (*task)(11, 22);
    });

    std::cout << res.get() << std::endl;
    thr.join();
    return 0;
}